package FutureExample;

import java.util.concurrent.*;
import java.util.function.BiFunction;

public class CompletableFutureExample {
    public static void main(String[] args) {
        CompletableFuture<Void> completableFuture=CompletableFuture.runAsync(()->{
            for (int i = 0; i < 10000; i++) {
                System.out.println(i);
            }
        }).thenRun(() -> {
            System.out.println("活干完了,老板，结账");
        });
        System.out.println("Main..");

        // 这是一个其实很自然的问题，或者说不应该是问题的。
        // 如果没有下面的completableFuture.join(), 上面的子线程大概率是执行不完的。 为什么？
        // 因为这样启动的是一个java程序。主线程都执行结束了，程序就结束了，但子线程不一定会立即结束。
        // 这个case，主线程结束了，此时又没有其它守护线程，所以JVM结束了， JVM一结束，所有的线程都自动终止。
        // 这和http请求的处理是不一样的。http请求处理是有web容器的。 java程序没有。

        // join()方法会等待子线程结束之后，主线程才会继续执行.
        completableFuture.join();
    }
}
